home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d1
/
bastips2.arc
/
STRVARS.TXT
< prev
Wrap
Text File
|
1988-11-29
|
5KB
|
98 lines
BASIC String Variables
(BYTE Magazine June 1985 Review Feedback)
In any BASIC program it is possible to substitute a variable for a
string when it is not acceptable to the BASIC interpreters by leaving
blank spaces within the quotation marks that need the string, then
POKEing the string variable into the blanks character-by-character.
This works in any variation of any BASIC.
Most BASICs store keywords like OPEN, CLOSE, and GOTO as a 1-byte
token instead of correctly spelling the keyword. This saves memory and
speeds searches for the correct routine to execute the command. Some
versions of Microsoft BASIC use 153 as the token for OPEN. The numbers
are usually above the highest printing ASCII codes (above 127) and
appear as graphics characters if you PEEK into the spot where the OPEN
token is stored. If you loop through the computer's memory looking for
the OPEN command's token, you will locate the line of code that needs to
have the variable POKEd into the blanks between the quotation marks. In
other words, you tell the computer to look through its memory starting
at the beginning of your program and find the line you need by searching
for OPEN.
You need to look at a memory map of your computer to find out the
address of the pointer that stores the address of the start of a BASIC
program. The BST variable in line 200 of program 1 below is the address
that points to the start of the BASIC program area, sometimes referred
to as the BASIC buffer. BEND is the variable found by PEEKing the
address of the start of the variables found in the pointer table. Some
BASICs do not use a pointer to the end of your program; the end is
simply defined by a series of zeros when the program is entered. You
should find both BST and BEND before running the subroutine by PEEKing
at the table of pointers and using the appropriate math. You can find
them during program execution if you know the pointers for sure.
If you do not have a memory map and do not know what the token for
OPEN is, loop through the entire memory looking for a dummy line of
text, then branch out of the loop and get the address where the dummy
text was found (see program 2).
Progarm 1 POKEs FL$ into the filename after OPEN in line 110. This
whole section is treated as a subroutine and is exited after the CLOSE
statement in line 130. More string manipulation could be done to check
for a filename extension in FL$ instead of truncating FL$ when it is too
long and forcing the extension to DAT. BST, BEND, and FL$ must be
initialized before entering the subroutine.
After you run this program, get a listing and see how line 110 is
changed with FL$ in place of the blank spaces.
Program 2 should be run independently of the first program and run
several times using different characters in the remark statement in line
10, and in lines 50 and 110 to be certain there isn't a felonious group
of Xs. After finding the start of BASIC, you find the end by adding the
available memory in an empty buffer to the start address.
- - - - -
Program 1: POKEs FL$ into a filename
105 GOSUB 200
110 OPEN "0",#1," /DAT"
120 PRINT #1,"SOME DATA"
130 CLOSE #1
140 RETURN
200 FOR A=BST TO BEND
205 'BST & BEND are start and end of BASIC buffer
210 IF PEEK(A)=(TOKEN FOR "OPEN") THEN 250
215 'Line 210 branches at the OPEN token
220 NEXT A:RETURN
250 IF PEEK(A+1)=34 THEN 280
260 'Line 250 checks character after OPEN
265 'and branches at CHR$(34) or " sign
270 NEXT A:RETURN
280 IF PEEK(A+2)=ASC("0") THEN 310
290 'Line 280 is second redundancy check
300 NEXT A:RETURN
310 FL=8:IF LEN(FL$)<>8 THEN GOSUB 500
320 'Line 310 branches to padding routine to bring
325 'length of FL$ to 8 characters
330 C=0:FOR B=A+9 TO A+9+FL
340 C=C+1:POKE B,ASC(MID$(FL$,C,1))
350 NEXT B:NEXT A:RETURN
500 IF LEN(FL$)>8 THEN 550
510 FOR PAD=LEN(FL$) TO 7
520 FL$=FL$+" "
530 NEXT PAD:RETURN
550 FL$=LEFT$(FL$,8):RETURN
- - - - -
Program 2: Finds the start address of the BASIC buffer and the token for
OPEN
10 'XXXXXXXXXXXXXXXX
20 OPEN "0",#1,"DUMMY"
30 CLOSE #1
40 FOR X=0 TO 65536
50 IF PEEK(X)=ASC("X") THEN 100
60 NEXT X:END
100 FOR Y=X TO X+16
110 IF PEK(Y)<>ASC("X") THEN 60
120 NEXT Y:PRINT "START ADDRESS OF BASIC IS";X-8
130 FOR Y=X TO X+25
140 IF PEEK(Y)=34 THEN 200
150 NEXT Y
200 PRINT"TOKEN FOR OPEN COMMAND IS";PEEK(Y-1)
-----------------------------------------------------------------